/**
 * @description 发布订阅类
 * @class {Pubsub}
 * @author hhx
 * @date 2024-11-21 17:11
 * @version 0.1.2
 */
export class Pubsub {

    /**
     * @description 订阅者集合
     * @private
     * @type {Map}
     */
    _events = null;

    /**
     * @description 订阅者构造函数
     * @public
     * @constructor
     * @param  {}
     */
    constructor() {

        this.init();

    }

    //========================== 内部成员 ==========================

    /**
     * @description 获取 事件集合
     * @member
     * @protected
     * @return {Map} 事件集合
     */
    get events() {
        return this._events;
    }

    /**
     * @description 设置 事件集合
     * @member
     * @protected
     * @param value {Map} 事件集合
     */
    set events(value) {
        this._events = value;
    }

    //========================== 成员方法 ==========================

    /**
     * @description 获取事件集合
     * @public
     * @return {Map} 事件集合
     */
    getEvents() {
        return this.events;
    }

    /**
     * @description 设置 事件集合
     * @public
     * @param value {Map} 事件集合
     */
    setEvents(value) {
        this.events = value;
    }

    //========================== 接口方法 ==========================

    /**
     * @description 订阅事件对象
     * @public
     * @param event {string} 事件名称
     * @param callback {Function} 事件回调
     */
    subscriber(event, callback) {

        if (this.events.has(event)) {
            let eventArr = this.events.get(event);
            eventArr.push(callback);
            this.events.set(event, eventArr);
        } else {
            let eventArr = [];
            eventArr.push(callback);
            this.events.set(event, eventArr);
        }
    }

    /**
     * @description 发布消息
     * @public
     * @param event {string} 消息事件
     * @param value {object} 参数
     */
    publish(event, value) {

        if (this.events.has(event)) {
            let pubsubArr = this.events.get(event);

            for (const callback of pubsubArr) {
                callback(value)
            }

        }

    }

    //========================== 初始方法 ==========================

    /**
     * @description 初始化方法
     * @protected
     */
    init() {
        this.events = new Map();
    }
}